public class Animal {
    // ***** 成员变量/属性 *****
    public String name;
    public int age;
    //静态成员变量，存储在方法区，全局只有一份。静态成员变量的就地初始化只有一次机会，后面不能进行修改。
    //加static之后，当前成员变量就不属于对象了
    public static String color = "白色";


    //  ***** 代码块 *****
    //执行顺序：静态->实例->构造
    //静态代码块（类被加载的时候）
    //不管实例化几次成员，静态的只会被执行一次
    static{
        color = "黄色";
        //System.out.println("Animal类的静态代码块被执行了");
    }
    //实例代码块
    {
        name = "尼莫";
        age = 6;
        //System.out.println("Animal类的实例代码块被执行了，一般用来初始化实例数据成员");
    }


    // ***** 构造方法 *****
    // （主要用来初始化这个对象的成员变量）
    // 1.没有返回值 2.方法名和类名一样 3.构成重载
    //Java默认提供不带参数的构造方法，要是自己写了构造方法就不提供不带参数的构造方法
    public Animal(){
        //this("其他动物",1); //必须在第一行
        //System.out.println("Animal类的不带参数的构造方法被执行了");
    }
    // ***** this ***** 有三种用法：（只能在非静态成员方法中使用）
    //1、this.data 访问当前对象的成员变量
    //2、this.func() 调用当前对象的成员方法
    //3、this() 调用当前对象的其他构造方法
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        //System.out.println("Animal类的带2个参数的构造方法被执行了");
    }


    // ***** 成员方法 *****
    public void eat(){
        System.out.println(this.name + " 正在吃饭...");
    }
    @Override //注解，说明是重写的
    public String toString(){
        return "Animal{" +
                "name='" + name + '\'' +
                ",age=" + age +
                '}';
    }
    //静态成员方法
    public static String getColor(){
        return color;
    }
}